package com.dao.impl;

import com.utils.jdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class BaseDao {
    QueryRunner query = new QueryRunner();

    /**
     * 修改数据
     * 用来执行 insert update delete
     */
    public int update(String sql,Object... obj){
        Connection conn = jdbcUtils.getConnection();
        try {
           return query.update(conn,sql,obj);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            System.err.println("-----------用户名或密码错误无法登录--------------");
        }finally{
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return 0;
    }

    /**
     * 查询返回一个javabean的语句
     * @param type 返回对象的类型
     * @param sql  SQL语句
     * @param obj   参数
     * @param <T>   返回类型的泛型
     * @return  返回一个javabean  没有返回null
     */
    public <T> T QueryForOne(Class<T> type ,String sql,Object... obj){
                Connection conn = jdbcUtils.getConnection();
        try {
            return query.query(conn,sql, new BeanHandler<T>(type),obj);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }
    /**
     *查询多个sql数据
     * @param type 返回对象类型
     * @param sql SQL语句
     * @param obj 参数
     * @param <T> 返回泛型类型
     * @return  查询到的多个javabean的sql数据  没有返回null
     */
    public <T> List<T> QueryForList(Class<T> type , String sql, Object... obj){
         Connection conn = jdbcUtils.getConnection();
        try {
          return  query.query(conn,sql,new BeanListHandler<T>(type),obj);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 执行返回一行一列的 sql 语句
     * @param sql 执行的 sql 语句
     * @param obj sql 对应的参数值
     * @return
     */
    public Object queryForSingleValue(String sql,Object... obj){
        Connection conn = jdbcUtils.getConnection();
        try {
           return Integer.parseInt(String.valueOf(query.query(conn,sql,new ScalarHandler(),obj)));
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }

}
